package com.malou.client.ventas.gasto;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.serie.Series;

public class GastoDialog extends Dialog {
	private Button guardar;
	private Button cancelar;
	public Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);

	public TextField<String> descripcion;
	public TextField<String> numerodocumento;
	public TextField<String> observacion;
	public ComboBox<BeanModel> documento;
	private NumberField monto;
	private Button addDetalle;
	private Button delDetalle;
	private DateField fechagasto;

	private ListStore<BeanModel> store;
	private Grid<BeanModel> grid;
	private ToolBar toolBar;

	public GastoDialog() {
		setLayout(new FitLayout());
		setModal(true);
		setPlain(true);
		setSize(850, 350);
		setClosable(true);

		FormPanel panel = new FormPanel();
		panel.setBorders(false);
		panel.setBodyBorder(false);
		panel.setPadding(5);
		panel.setHeaderVisible(false);

		addFields(panel);

		setButtonAlign(HorizontalAlignment.LEFT);
		setButtons("");
		add(panel);

		setBodyBorder(true);
		setResizable(false);
		setFocusWidget(descripcion);

		setIconStyle("icon-stock");
		setHeading(constants.gastoNuevo());
	}

	private void addFields(ContentPanel cp) {

		LayoutContainer main = new LayoutContainer();

		FieldSet gasto_data = new FieldSet();
		gasto_data.setHeading(constants.gastoAgregarDetalle());
		gasto_data.setLayout(new ColumnLayout());

		fechagasto = new DateField();
		fechagasto.setValue(new Date());
		fechagasto.setFieldLabel(constants.ventaFecha());
		fechagasto.getPropertyEditor().setFormat(
				DateTimeFormat.getFormat("yyyy-MM-dd"));

		descripcion = new TextField<String>();
		descripcion.setFieldLabel(constants.gastoDescripcion());


		monto = new NumberField();
		monto.setFieldLabel(constants.gastoImporte());
		monto.setAllowNegative(false);
		monto.setPropertyEditorType(Double.class);
		
		Series.getComboDocumento();
		Series.loaderCombo.load(); // for edit

		documento = new ComboBox<BeanModel>();
		documento.setEditable(false);
		documento.setFieldLabel(constants.gastoDocumento());

		documento.setDisplayField("descripcion");
		documento.setEmptyText(constants.seleccione());
		documento.setStore(Series.storeCombo);
		documento.setTypeAhead(true);
		documento.setTriggerAction(TriggerAction.ALL);
		documento.setValueField("descripcion");

		documento.getStore().addStoreListener(new StoreListener<BeanModel>() {
			public void storeDataChanged(StoreEvent<BeanModel> se) {
				super.storeDataChanged(se);
				List<BeanModel> list = new ArrayList<BeanModel>();
				list.add(documento.getStore().getAt(2));// documento: otro
				documento.setSelection(list);
			}
		});

		

		numerodocumento = new TextField<String>();
		numerodocumento.setFieldLabel(constants.gastoNumero());
		

		observacion = new TextField<String>();
		observacion.setFieldLabel(constants.gastoObservaciones());
		observacion.addKeyListener(new KeyListener() {
			public void componentKeyDown(ComponentEvent event) {
				if (event.getKeyCode() == KeyCodes.KEY_ENTER) {
					agregarDetalle();
				}
			}
		});

		addDetalle = new Button(constants.agregar());
		addDetalle.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				agregarDetalle();
			}
		});
		
		Component comp[]={documento,numerodocumento,monto,fechagasto,descripcion,observacion,addDetalle};
		Utilities.Enter(comp);
		
		gasto_data.add(setLayout(documento, 70, "90%"), new ColumnData(0.30));
		gasto_data.add(setLayout(numerodocumento, 50, "90%"), new ColumnData(0.30));
		gasto_data.add(setLayout(monto, 50, "90%"), new ColumnData(0.20));
		gasto_data.add(setLayout(fechagasto, 35, "100%"), new ColumnData(0.20));
		
		gasto_data.add(setLayout(descripcion, 70, "90%"), new ColumnData(0.45));
		gasto_data.add(setLayout(observacion,90, "90%"), new ColumnData(0.45));
		gasto_data.add(addDetalle, new ColumnData(0.10));

		// detalle

		toolBar = new ToolBar();

		delDetalle = new Button(constants.eliminar(),
				IconHelper.createPath("images/icons/delete.gif"));
		delDetalle.setEnabled(false);

		SelectionListener<ButtonEvent> sl_del;
		sl_del = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				BeanModel be = grid.getSelectionModel().getSelectedItem();
				grid.getStore().remove(be);
			}
		};
		delDetalle.addSelectionListener(sl_del);
		toolBar.add(delDetalle);

		store = new ListStore<BeanModel>();

		RowNumberer r = new RowNumberer();
		ArrayList<ColumnConfig> columns = new ArrayList<ColumnConfig>();
		ColumnConfig column = new ColumnConfig();
		columns.add(r);
		columns.add(new ColumnConfig("descripcion", constants.gastoDescripcion(), 250));

		column = new ColumnConfig("monto", constants.gastoImporte(), 80);
		column.setAlignment(HorizontalAlignment.RIGHT);
		columns.add(column);
		columns.add(new ColumnConfig("documento", constants.gastoDocumento(),100));
		columns.add(new ColumnConfig("numero", constants.gastoNumero(), 80));

		column = new ColumnConfig("observaciones",constants.gastoObservaciones(), 250);
		columns.add(column);

		ColumnModel cm = new ColumnModel(columns);

		grid = new Grid<BeanModel>(store, cm);
		grid.addPlugin(r);
		grid.setAutoExpandColumn("descripcion");
		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						if (be.getSelectedItem() != null)
							delDetalle.setEnabled(true);
						else
							delDetalle.setEnabled(false);
					}
				});

		ContentPanel detalle = new ContentPanel();
		detalle.setHeaderVisible(false);
		detalle.setLayout(new FitLayout());
		detalle.setHeight(200);
		detalle.add(grid);
		detalle.setTopComponent(toolBar);

		main.add(gasto_data, new FormData("100%"));
		main.add(detalle, new FormData("100%"));

		cp.add(main);
	}

	@Override
	protected void createButtons() {
		super.createButtons();

		if (constants == null) {
			constants = GWT.create(MalouConstants.class);
		}

		status = new Status();
		status.setBusy(constants.guardando());
		status.hide();
		status.setAutoWidth(true);
		getButtonBar().add(status);

		getButtonBar().add(new FillToolItem());

		cancelar = new Button(constants.cancelar());

		cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				GastoDialog.this.hide();
			}

		});

		guardar = new Button(constants.guardar());

		guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				if (validarPrincipal()) {
					status.show();
					getButtonBar().disable();

					List<Gasto> list = new ArrayList<Gasto>();
					Gasto gs;

					for (BeanModel b : store.getModels()) {
						gs = new Gasto();
						gs.setDescripcion(b.get("descripcion").toString());
						gs.setFecha(fechagasto.getValue());
						gs.setMonto(Double.valueOf(b.get("monto").toString()));
						if (b.get("observaciones") != null)
							gs.setObservaciones(b.get("observaciones")
									.toString());
						if (b.get("numero") != null)
							gs.setNumero(b.get("numero").toString());
						gs.setTipodocumento_id(Integer.valueOf(b.get(
								"tipodocumento_id").toString()));

						list.add(gs);
					}

					Gastos.gastoDialog = GastoDialog.this;
					Gastos.save(list);
				}
			}
		});

		addButton(guardar);
		addButton(cancelar);

	}

	public boolean validarDetalle() {
		descripcion.setAllowBlank(false);
		monto.setAllowBlank(false);

		boolean des = descripcion.isValid();
		boolean mon = monto.isValid();

		descripcion.setAllowBlank(true);
		monto.setAllowBlank(true);

		return des && mon;
	}

	public boolean validarPrincipal() {

		boolean det = true;
		if (store.getCount() == 0) {
			det = false;
			MessageBox.alert(constants.sistemaMarcocruzado(),
					constants.detalleRequerido(), null);
			descripcion.focus();
		}

		return det;
	}

	public void clearDetalle() {

		descripcion.clear();
		monto.clear();
		numerodocumento.clear();
		observacion.clear();

	}

	public void clearPrincipal() {

		store.removeAll();
		clearDetalle();

	}

	public void agregarDetalle() {
		if (validarDetalle()) {

			Gasto gs = new Gasto();

			gs.setDescripcion(descripcion.getValue());
			gs.setMonto(Double.valueOf(monto.getValue().toString()));
			gs.setNumero(numerodocumento.getValue());
			gs.setObservaciones(observacion.getValue());
			gs.setTipodocumento_id(Integer.parseInt(documento.getValue()
					.get("id").toString()));
			gs.setDocumento(documento.getValue().get("descripcion").toString());

			BeanModelFactory beanModelFactory = BeanModelLookup.get()
					.getFactory(gs.getClass());
			store.add(beanModelFactory.createModel(gs));
			clearDetalle();
			descripcion.focus();

		}
	}

	private LayoutContainer setLayout(Component comp, Integer labelwith,
			String porcentaje) {

		LayoutContainer lc5 = new LayoutContainer();
		FormLayout fl = new FormLayout(LabelAlign.LEFT);
		fl.setLabelPad(0);
		fl.setLabelWidth(labelwith);
		lc5.setLayout(fl);
		lc5.setStyleAttribute("marginTop", "0px");
		lc5.add(comp, new FormData(porcentaje));

		return lc5;
	}

}
